﻿using System.Security.Cryptography;
using BLL.Utility;
using Entity.Context;
using Entity.Models;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BLL.Sgf
{
    public sealed class CategoriaRecebimentoBLL : AbstractClass
    {

        #region -- VerificaCategoriaCadastrada --
        private static bool VerificaCategoriaCadastrada(CategoriaRecebimento pEntity)
        {
            try
            {
                using (var ctx = new Context())
                {
                    return (from c in ctx.CategoriaRecebimento
                            where c.Descricao.Equals(pEntity.Descricao)
                            select c).Any();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaBLL.ValidaDados :: " + ex.Message, ex);
            }
        }
        #endregion

        #region -- Valida --
        private static void Valida(CategoriaRecebimento pEntity)
        {
            if (VerificaCategoriaCadastrada(pEntity))
                throw new EValidationException("Modalidade já Cadastrada");
        }
        #endregion

        #region -- Salvar --
        public void Salvar(CategoriaRecebimento pEntity)
        {
            try
            {
                Valida(pEntity);
                using (var ctx = new Context())
                {
                    ctx.CategoriaRecebimento.Add(pEntity);
                    ctx.SaveChanges();
                }
            }
            catch (EValidationException evx)
            {
                throw new EValidationException(evx.Message);
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaBLL.SalvarCategoria :: " + ex.Message, ex);
            }
        }
        #endregion

        #region -- BuscaTodos --
        public IList BuscaTodos(int pUsuarioId)
        {
            try
            {
                using (var ctx = new Context())
                {
                    return (from c in ctx.CategoriaRecebimento
                            where c.UsuarioId == pUsuarioId
                            orderby c.Descricao
                            select c).ToList();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaBLL.BuscaTodos ::" + ex.Message, ex);
            }
        }
        #endregion

        #region -- Saldo --
        public decimal Saldo()
        {
            try
            {
                using (var ctx = new Context())
                {
                    return ctx.Recebimento
                        .Select(c => c.ValorRecebido)
                        .Sum();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaRecebimentoBLL.Saldo :: " + ex.Message, ex);
            }
        }
        #endregion

    }
}
